/**
 * 给定互异的N和M，再给定K，
 * 求满足条件的第K小的数，条件为：N的倍数或者M的倍数但不是公倍数
 * 注意到K很大，不能直接枚举
 * 设N和M的最小公倍数为lcm，则
 * N,2N,3N,...,     , N,2N,...
 *              LCM            2LCM
 * M,2M,3M,...,     , M,2M,...
 * 因此每一段LCM之间有固定的满足条件的数
 * 首先计算出固定的数量，然后再确定一段内的大小即可 
 * 一段内最多的数量为N+M，再排个顺序
 * O(NlogN)级别
 * 标程用的是二分
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;

llt N, M, K;

llt proc(){
    auto g = __gcd(N, M);
    auto lcm = N / g * M;
    auto an = M / g - 1;
    auto bn = N / g - 1;

    auto bei = K / (an + bn);
    auto left = K % (an + bn);

    if(0 == left){
        auto tmp = max(an * N, bn * M);
        return lcm * (bei - 1) + tmp;
    }

    __gnu_pbds::priority_queue<llt, greater<llt>> q;
    q.push(N);
    q.push(M);
    for(int i=1;i<left;++i){
        auto h = q.top(); q.pop();
        if(0 == h % N) q.push(N + h);
        else q.push(M + h);
    }
    auto h = q.top();
    return h + lcm * bei;
}

void work(){
    cin >> N >> M >> K;
    cout << proc() << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}